package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.ShoppingCart;
import com.itheima.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年05月29日
 * @description ：
 *    购物相关的处理功能
 * @version: 1.0
 */
@RestController
@Slf4j
@RequestMapping("/shoppingCart")
public class ShoppingCartController {
       @Autowired
        private ShoppingCartService shoppingCartService;
        /**
         *  把一个菜品/套餐 变成购物项存储起来
         *    购物车是由多个购物项组成
         *    shoppingCart 添加到购物车的一个购物项
         *            可能是菜品 可能是套餐
         */
        @PostMapping("/add")
        public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
             //添加相同的 菜品 或者套餐  购物项 会不会增加 购物项中数量属性会加1
            log.info("要添加的购物项数据是:"+shoppingCart);
         // 1: 应该先把这个用户
          //    一个用户一个购物车  根据用户id查询相关所有购物项
          // 获取用户id
         Long userId= BaseContext.getCurrentId();//是我们在过滤器中存储的用户id
         // 根据 用户id查询
         LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
         //  你告诉我sql语句怎么写
         //    如果 传递过来要添加的购物项是套餐,
         //    我就去数据库查该用户的购物项中是否包含该套餐
         //  select * from shopping_cart where user_id = ? and  setmeal_id= ?
         // 如果 传递过来要添加的购物项是  菜品
          //  我就去数据库查询该用户的 购物项中是否包含该菜品
         // select * from shopping_cart where user_id = ? and  dish_id= ?
         // 现在 warpper里面加入 公共条件字段
         wrapper.eq(ShoppingCart::getUserId,userId);
         //  如果  shoppingCart 里面的 setmealId 不是空 说明加入购物车的是 套餐
         if(shoppingCart.getSetmealId()!=null){//是套餐
          //   select * from shopping_cart where user_id = ? and  setmeal_id= ?
               wrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
         }else{//是  菜品
          // 否则 执行  select * from shopping_cart where user_id = ? and  dish_id= ?
               wrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
         }
          //sql语句查询之后
         ShoppingCart one = shoppingCartService.getOne(wrapper);//根据条件查询一个数据
         //one就是  购物项   如果没有就是null 数据库有 就是数据库保存的哪个数据
         if(one!=null){// 如果存在  说明 已经有该购物项了 只需要 数量+1
             one.setNumber(one.getNumber()+1);
             //更新 数量
             shoppingCartService.updateById(one);
             shoppingCart = one;//把 加后的 购物项 返回回去
         }else{// 如果不存在  说明没有该购物项   当成新的购物项  保存到数据库  数量就是1
             // shoppingCart 要添加的购物项
            shoppingCart.setNumber(1);
            shoppingCart.setUserId(userId);
            shoppingCart.setCreateTime(LocalDateTime.now());
            //存储起来
            shoppingCartService.save(shoppingCart);
         }

         return R.success(shoppingCart);



        }

    /**
     * 查询所有购物项
     *    查看购物车就是查询某个用户的 所有购物项
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>>  list(){
        log.info("查看购物车就是查询某个用户的 所有购物项");
        //先找id
        Long userId= BaseContext.getCurrentId();//是我们在过滤器中存储的用户id
        //查询所有购物项 根据用户id差
        // 根据 用户id查询
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);
        wrapper.orderByDesc(ShoppingCart::getCreateTime);//时间降序
        List<ShoppingCart> list = shoppingCartService.list(wrapper);

        return R.success(list);
    }

    /**
     * 清空购物车
      */
    @DeleteMapping("/clean")
    public R<String> clean(){
        //根据用户id删除 所有的购物项
        log.info("查看购物车就是查询某个用户的 所有购物项");
        //先找id
        Long userId= BaseContext.getCurrentId();//是我们在过滤器中存储的用户id
        //查询所有购物项 根据用户id差
        // 根据 用户id查询
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);

        shoppingCartService.remove(wrapper);//根据userid删除

        return R.success("购物项清空");
    }
}
